/**
 * 开始继承之旅, 子类的原型对象 —— 类式继承
 * 类式继承的缺点
 *      1、一个子类的实例更改子类原型从父类构造函数中继承来的共有属性就会直接影响到其他子类
 *          子类通过其原型prototy对父类实例化，继承了父类。
 *          所以父类中的共有属性要是引用属性就会在子类中被所有实例共用
 *      2、在实例化父类的时候无法对父类构造函数内的属性进行初始化
 *          子类实现的继承是靠其原型prototype对父类的实例化实现的，因为在创建父类的无法向父类传递参数
 * 知识点
 *      1、类有三个部分
 *          a.构造函数内的 => 供实例化对象复制用的
 *          b.构造函数外的，通过点语法添加 => 供类使用
 *          c.类的原型中的，实例化对象可以通过其原型链间接访问 => 供所有实例化对象共用
 *      2、JS没有继承这一现有的机制，如何实现？
 *          将父类的实例赋值给子类的原型
 * 
 *          类的原型对象的作用：为类的原型添加共有方法，但类不能直接访问这些属性和方法，只能通过原型prototype来访问
 *      3、instanceof   
 *          通过判断对象的prototype链来确定这个对象是否是某个类的实例，并不关心对象与类的自身结构
 */
// 类式继承
// 声明父类
function SuperClass() {
    this.superValue = true;
}

// 为父类添加共有方法
SuperClass.prototype.getSuperValue = function() {
    return this.superValue;
};

// 声明子类
function SubClass() {
    this.subValue = false;
}

// 继承父类
SubClass.prototype = new SuperClass();
// 为子类添加共有方法
SubClass.prototype.getSubValue = function() {
    return this.subValue;
};

var instance = new SubClass();
console.log(instance.getSuperValue());
console.log(instance.getSubValue());

console.log(instance instanceof SuperClass);//true
console.log(instance instanceof SubClass);//true
console.log(SubClass instanceof SuperClass);//false

console.log(SubClass.prototype instanceof SuperClass);//true

// 缺点: 更改子类中从父类继承而来的引用类型属性，会影响其他的子类
console.log('缺点');
function SuperClassCopy() {
    this.books = ['JavaScript', 'html', 'css'];
    this.number = 9;
}
function SubClassCopy() {}
SubClassCopy.prototype = new SuperClassCopy();
var instance1 = new SubClassCopy();
var instance2 = new SubClassCopy();
console.log(instance2.books, instance2.number);
instance1.books.push('设计模式');//['JavaScript', 'html', 'css'], 9
instance1.number = 10;
console.log(instance2.books, instance2.number);//["JavaScript", "html", "css", "设计模式"], 9
